package com.cmyshare.design.strategyAndFactorySpring;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @version 1.0
 * @Author cmy
 * @Date 2025/10/13 16:20
 * @desc 支付策略工厂
 */
@Component
public class PaymentFactory {

    /**
     * 方案1：自动注册支付策略
     */
    /**
     * Spring会自动将所有实现PaymentStrategy接口的Bean注入到这个Map中
     * key为@Service注解指定的名称（如"ALIPAY"），value为对应的策略实现类
     */
    private final Map<String, PaymentStrategy> paymentStrategies = new ConcurrentHashMap<>();

    /**
     * 构造函数注入所有支付策略
     * @param paymentStrategies 所有支付策略的Map集合
     */
    public PaymentFactory(Map<String, PaymentStrategy> paymentStrategies) {
        this.paymentStrategies.putAll(paymentStrategies);
    }

    /**
     * 根据支付类型获取对应的支付策略
     * @param paymentType 支付类型（如"ALIPAY"、"WECHAT"）
     * @return 对应的支付策略
     * @throws IllegalArgumentException 如果支付类型不支持
     */
    public PaymentStrategy getPaymentStrategy(String paymentType) {
        PaymentStrategy strategy = paymentStrategies.get(paymentType);
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的支付类型: " + paymentType +
                    ", 支持的支付类型有: " + paymentStrategies.keySet());
        }
        return strategy;
    }

    /**
     * 获取所有支持的支付类型
     * @return 支持的支付类型列表
     */
    public Map<String, PaymentStrategy> getSupportedPaymentTypes() {
        return new ConcurrentHashMap<>(paymentStrategies);
    }

    /**
     * 方案2：使用 Spring 的依赖注入机制
     */
    //// 存储支付策略的映射，key为支付类型，value为对应的策略实现
    //private final Map<String, PaymentStrategy> strategyMap = new ConcurrentHashMap<>();
    //
    ////@Autowired 在这里的核心作用是让 Spring 自动收集并注入所有支付策略，从而实现策略的自动注册和管理。
    //// 这是 Spring 环境下结合工厂模式与策略模式的经典做法，既利用了 Spring 的依赖注入特性，又保证了代码的灵活性和可扩展性。
    //// 构造函数注入所有支付策略实现
    //@Autowired
    //public PaymentFactory(List<PaymentStrategy> strategyList) {
    //    // 遍历策略列表，构建策略映射
    //    for (PaymentStrategy strategy : strategyList) {
    //        // 获取@Service注解的value作为支付类型
    //        String paymentType = getPaymentTypeFromServiceAnnotation(strategy);
    //        if (paymentType != null) {
    //            strategyMap.put(paymentType, strategy);
    //        }
    //    }
    //}
    //
    ///**
    // * 获取支付策略
    // * @param paymentType 支付类型
    // * @return 对应的支付策略
    // */
    //public PaymentStrategy getPaymentStrategy(String paymentType) {
    //    PaymentStrategy strategy = strategyMap.get(paymentType);
    //    if (strategy == null) {
    //        String supportedTypes = strategyMap.keySet().stream()
    //                .collect(Collectors.joining(","));
    //        throw new IllegalArgumentException(
    //                "不支持的支付类型: " + paymentType +
    //                        ", 支持的支付类型有: " + supportedTypes
    //        );
    //    }
    //    return strategy;
    //}
    //
    ///**
    // * 从@Service注解中获取支付类型
    // */
    //private String getPaymentTypeFromServiceAnnotation(PaymentStrategy strategy) {
    //    Class<?> clazz = strategy.getClass();
    //    if (clazz.isAnnotationPresent(Service.class)) {
    //        Service serviceAnnotation = clazz.getAnnotation(Service.class);
    //        return serviceAnnotation.value();
    //    }
    //    return null;
    //}
    //
    ///**
    // * 获取所有支持的支付类型
    // */
    //public List<String> getSupportedPaymentTypes() {
    //    return strategyMap.keySet().stream().collect(Collectors.toList());
    //}
}
